package com.dqlp.yf.rabbitmq.controller;

import com.dqlp.yf.rabbitmq.bean.Order;
import com.dqlp.yf.rabbitmq.constant.MqConstant;
import com.dqlp.yf.rabbitmq.sender.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: rabbitmq
 * @description: 消息控制器
 * @author: andy
 * @create: 2019-09-07 11:00
 */
@RestController
@CrossOrigin
@RequestMapping(value = "queue")
public class queueController {
    @Autowired
    Sender sender;
    @Autowired
    DlxSender dlxSender;

    /**
    *@Description:  测试用的，没有绑定交换机，使用默认的交换机direct模式
    *@Param: [msg]
    *@return: void
    *@Author: andy
    *@date: 2019/9/9
    */
    @GetMapping(value = "/send")
    public void send(String msg) {
        sender.send(msg,MqConstant.ROUTERKEY);

    }

    @Autowired
    TopicSender topicSender;

    /**
    *@Description:  这个是死信队列，产生死信队列有三种可能，
     *                   第一：对于一些拒绝消费的而且不重回队列的消息进入死信队列
     *                   第二：对于一些过期的队列
     *                   第三：对于已经设置队列的最大消息值的，再次进入队列的
     *                   绑定死信队列的要点就是在声明队列的时候设置参数 x-dead-letter-exchange 指向对应的交换机就可以了
    *@Param: [msg]
    *@return: void
    *@Author: andy
    *@date: 2019/9/9
    */
    @GetMapping(value = "/dlsSend")
    public void dlsSend(String msg) {
        dlxSender.sendMessage(msg,MqConstant.DIRECT_ROUTERKEY);
    }

    /**
    *@Description:  一对多的模式，设置routingkey为xx.#或者xx.*   #号表示可以包含多个参数   * 表示可以包含一个参数
    *@Param: [msg]
    *@return: void
    *@Author: andy
    *@date: 2019/9/9
    */
    @GetMapping(value = "/sendTopic")
    public void sendTopic(String msg) {
        topicSender.sendTopic(msg,"topic.message");
    }

    @Autowired
    FanoutSender fanoutSender;

    /**
    *@Description:   广播模式：不用设置还是不设置routingkey  都可以消费
    *@Param: []
    *@return: void
    *@Author: andy
    *@date: 2019/9/9
    */
    @GetMapping(value = "/fanoutSender")
    public void fanoutSender() {
        Order order = new Order(2,"你好，我是fanout队列");
        fanoutSender.fanoutSender(order);

    }

    @Autowired
    LazySender lazySender;
    /**
    *@Description: 延迟队列，使用的rabbitmq的一个插件：rabbitmq_delayed_message_exchange 需要下载下来放到plugins文件夹里面
     *                      然后启动这个插件，然后在创建queue的时候开启延迟队列就可以达到延迟效果，本人亲测正常使用
    *@Param: [msg]
    *@return: void
    *@Author: andy
    *@date: 2019/9/9
    */
    @GetMapping(value = "/lazySender")
    public void lazySender(String msg) {
        lazySender.lazySender(msg,MqConstant.LAZY_KEY);
    }
}
